// 'use strict';
// const moment = require('moment');
// const path = require('path');
// const fs = require('fs');
// const async = require('async');
// const superagent = require('superagent');
// const Alipay = require('alipay-node-sdk-wj'); // alipay-node-sdk 暂不支持转账到个人, 我 fork 了一份, 使用方式与 alipay-node-sdk 一致
// const Tenpay = require('tenpay');
// const CONFIG = require('../../../common/config');
// const codeUtil = require('../commonUtils/codeUtil');
//
// const YjxActFinanceHis = require('../../../common/yjxMysql/mapping/YjxActFinanceHis');
// const YjxPaymentHisModel = require('../../../common/yjxMysql/mapping/YjxPaymentHisModel');
//
// // 示界港支付宝企业账户
// const aliPayConfig = {
//     appId: '2018041602565700',
//     rsaPrivate: path.resolve(__dirname, '../ext/alipay/alipay_yjsc_private_key.pem'),
//     rsaPublic: path.resolve(__dirname, '../ext/alipay/alipay_yjsc_ali_public_key.pem'),
//     sandbox: false,
//     signType: 'RSA2',
//     notifyUrl: 'https://paycb.itbour.com:818/payment/chkAlipayNotify'   // 正式支付回调
// };
// // 示界港微信企业账户
// const tenpayConfig_201 = {
//     appid: 'wxeedea9703c7b2802',    // 201 小程序 appid, 没有商户 app id, 就用它
//     mchid: '1419473302',
//     partnerKey: 'Wefub8730xfyFekodbfgoFQmmnOwEREp',
//     pfx: fs.readFileSync(path.resolve(__dirname, '../ext/wxpay/apiclient_cert.p12')),
//     notify_url: 'https://paycb.itbour.com:818/payment/chkWxPayNotify',
//     spbill_create_ip: '192.168.1.0'
// };
// // 示界港微信企业账户
// const tenpayConfig_202 = {
//     appid: 'wx62e34e3e49dff423',    // 202 小程序 appid, 没有商户 app id, 就用它
//     mchid: '1419473302',
//     partnerKey: 'Wefub8730xfyFekodbfgoFQmmnOwEREp',
//     pfx: fs.readFileSync(path.resolve(__dirname, '../ext/wxpay/apiclient_cert.p12')),
//     notify_url: 'https://paycb.itbour.com:818/payment/chkWxPayNotify',
//     spbill_create_ip: '192.168.1.0'
// };
// // 测试环境更改回调地址
// if(CONFIG.DEBUG) {
//     // 测试环境 支付回调
//     aliPayConfig.notifyUrl = 'http://test.itbour.com:3006/payment/chkAlipayNotify';
//     tenpayConfig_201.notifyUrl = 'http://test.itbour.com:3006/payment/chkWxPayNotify';
// }
//
// const alipayClientsPool = {};
// const tenpayClientsPool = {};
//
// alipayClientsPool['*'] = new Alipay(aliPayConfig);
// tenpayClientsPool['201'] = new Tenpay(tenpayConfig_201);
// tenpayClientsPool['202'] = new Tenpay(tenpayConfig_202);
//
// /*
// * 端编号与账户主体名称关系对应
// * */
// const DEVICE_SUBJECT_MAP = {
//     '*': '武汉示界港科技有限公司',
//     '6': '武汉示界港科技有限公司',
//     '600': '一键秀',
//     '610': '一键秀',
//     '620': '一键秀',
//     '630': '一键秀',
//     '640': '一键秀',
//     '701': '抖企来冲顶大赛',
//     '702': '抖企来点赞大作战'
// };
//
//
// const financialServiceUtil = (function () {
//
//     function financialServiceUtil() {
//
//     }
//
//     /**
//      * 支付宝, 向个人转账业务
//      *
//      * @author 王俊
//      * @date 2018-07-22
//      *
//      *
//      * @param {Object} options
//      * @param {Object} options.client                       支付宝转账端(可能有多个账号, 从 alipayClientsPool 中取出)
//      * @param {Promise} options.client.toAccountTransfer
//      * @param {Number} options.tradeNo                      交易订单号
//      * @param {Number} options.tradeId                      订单 id (存 支付 his 表用)
//      * @param {Number} options.amount                       转账金额, 单位: 分
//      * @param {String} options.payeeAccount                 收款方账号,
//      * @param {String} [options.payeeName]                  收款方姓名(若传递则进行实名校验, 不传递则不进行实名校验)
//      * @param {String} options.remark                       转账备注
//      * @param {Function} callback 回调函数
//      *                      err
//      *                      info: 订单信息
//      */
//     financialServiceUtil.alipayToAccountTransfer = function (options, callback) {
//
//         const totalTasks = [];
//
//         // 1. 转账
//         totalTasks.push(function (callback) {
//             const opt = {
//                 out_biz_no: options.tradeNo,
//                 payee_account: options.payeeAccount,
//                 amount: options.amount/100, // 支付宝转账单位为元
//                 remark: options.remark,
//                 payee_type: 'ALIPAY_LOGONID', // 指定支付宝账户
//                 payeeName: options.payeeName
//             };
//             const data = {};
//             options.client.toAccountTransfer(opt)
//                 .then(function (result) {
//                     data.retData = result;
//                     // 判断 code
//                     data.retData = JSON.parse(result.body);
//                     // 成功处理
//                     if(Number(data.retData.alipay_fund_trans_toaccount_transfer_response.code) === 10000)  {
//                         return callback(null, data);
//                     }
//                     // 先取业务错误信息, 再取网关错误信息
//                     data.error = data.retData.alipay_fund_trans_toaccount_transfer_response.sub_msg || data.retData.alipay_fund_trans_toaccount_transfer_response.msg;
//                     return callback(null, data);
//                 }).catch(function (error) {
//                     data.error = error;
//                     return callback(null, data);
//                 });
//         });
//
//         // 2 记录
//         totalTasks.push(function (data, callback) {
//             const state = data.error ? 12 : 11; // 12 支付失败, 11 支付成功
//
//             const entity = new YjxPaymentHisModel({
//                 trade_type: 60,
//                 trade_obj_id: options.tradeId,
//                 trade_obj_no: options.tradeNo,
//                 state: state,
//                 pay_platform: 20,
//             });
//             // 支付成功, 继续记录信息
//             if(data.retData) {
//                 entity.pay_info1 = data.retData.alipay_fund_trans_toaccount_transfer_response.code;
//                 entity.pay_info2 = data.retData.alipay_fund_trans_toaccount_transfer_response.msg;
//                 entity.pay_info3 = data.retData.alipay_fund_trans_toaccount_transfer_response.sub_code;
//                 entity.pay_info4 = data.retData.alipay_fund_trans_toaccount_transfer_response.sub_msg;
//                 entity.pay_info5 = data.retData.sign;
//                 entity.pay_info6 = data.retData.alipay_fund_trans_toaccount_transfer_response.out_biz_no;
//                 entity.pay_info7 = data.retData.alipay_fund_trans_toaccount_transfer_response.order_id;
//                 entity.pay_info8 = data.retData.alipay_fund_trans_toaccount_transfer_response.pay_date;
//             }
//             entity.saveToDB(function (error, insertId) {
//                 return callback(error, data);
//             });
//         });
//         async.waterfall(totalTasks, function (error, data) {
//             if(error) return callback(error, null);
//             if(data.error) return callback(data.error, null);
//             return callback(null, data.retData);
//
//         });
//     };
//
//     /**
//      * 微信, 向个人转账业务(企业付款)
//      *
//      * @author 王俊
//      * @date 2018-07-22
//      *
//      * @param {Object} options
//      * @param {Object} options.client               使用的付款账户
//      * @param {Function} options.client.transfers   转账函数
//      * @param {Object} options.partner_trade_no     交易订单号
//      * @param {Object} options.tradeId              记录 id, 写 his 表使用
//      * @param {Object} options.platform             平台编号, 写 his 表使用
//      * @param {Object} options.openId               收款方的 openId, 注意要与 options.client 的 appid 配合
//      * @param {Object} [options.re_user_name]       若传递则校验收款方的真实姓名
//      * @param {Object} options.amount               付款金额, 单位: 分
//      * @param {Object} options.desc                 付款描述
//      * @param {Object} [options.spbill_create_ip]   交易 ip, 可不传
//      * @param {Function} callback
//      *                      error: 交易失败
//      *                      info: 交易成功订单信息
//      */
//     financialServiceUtil.wxpayToAccountTransfer = function (options, callback) {
//
//         const totalTasks = [];
//         // 1. 打账
//         totalTasks.push(function (callback) {
//             const opt ={
//                 partner_trade_no: options.partner_trade_no,
//                 openid: options.openId,
//                 check_name: options.re_user_name ? 'FORCE_CHECK' : 'NO_CHECK',
//                 re_user_name: options.re_user_name,
//                 amount: options.amount,
//                 desc: options.desc
//             };
//             const data = {};
//             options.client.transfers(opt)
//                 .then(function (result) {
//                     data.retData = result;
//                     if(data.retData.result_code === 'SUCCESS') {
//                         return callback(null, data);
//                     }
//                     // 业务处理失败
//                     data.error = data.retData.err_code_des || data.retData.err_code;
//                     return callback(null, data);
//                 })
//                 .catch(function (error) {
//                     data.error = error;
//                     return callback(null, data);
//                 });
//         });
//         // 2. 记录
//         totalTasks.push(function (data, callback) {
//             const state = data.error ? 12 : 11; // 12 支付失败, 11 支付成功
//
//             const entity = new YjxPaymentHisModel({
//                 trade_type: 60,
//                 trade_obj_id: options.tradeId,
//                 trade_obj_no: options. partner_trade_no,
//                 state: state,
//                 pay_platform: options.platform,
//             });
//             // 支付成功, 继续记录信息
//             if(data.retData) {
//                 entity.pay_info1 = data.retData.return_code;
//                 entity.pay_info2 = data.retData.return_msg;
//                 entity.pay_info3 = data.retData.mch_appid;
//                 entity.pay_info4 = data.retData.mchid;
//                 entity.pay_info5 = data.retData.nonce_str;
//                 entity.pay_info6 = data.retData.result_code;
//                 entity.pay_info7 = data.retData.err_code;
//                 entity.pay_info8 = data.retData.err_code_des;
//                 entity.pay_info9 = data.retData.partner_trade_no;
//                 entity.pay_info10 = data.retData.payment_no;
//                 entity.pay_info11 = data.retData.payment_time;
//             }
//             entity.saveToDB(function (error, insertId) {
//                 return callback(error, data);
//             });
//         });
//
//         async.waterfall(totalTasks, function (error, data) {
//             if(error) return callback(error, null);
//             if(data.error) return callback(data.error, null);
//             return callback(null, data.retData);
//
//         });
//
//     };
//
//
//     /**
//      * 根据转账信息打款给用户
//      *
//      * @author 王俊
//      * @date 2017-07-22
//      *
//      * @param {Object} options
//      * @param {Number} options.hisId    转账记录 id
//      * @param {Number} options.userId   操作人员 id
//      * @param {Function} callback 回调函数
//      *                      error: 转账失败
//      */
//     financialServiceUtil.transferToUserWithFinanceHis = function (options, callback) {
//
//         const totalTasks = [];
//
//         // 1. 根据 id 获取提现信息
//         totalTasks.push(function (callback) {
//             const entity = new YjxActFinanceHis({
//                 his_id: options.hisId,
//                 del_flg: 0
//             });
//             entity.findFromDB(function (error, results) {
//                 if(error || !results || results.length <=0) {
//                     return callback(error || '该提现记录不存在', null);
//                 }
//                 const his = results[0];
//                 if(his.state !== 10) {
//                     return callback('该笔提现记录状态异常, 无法打款', null);
//                 }
//                 if(his.cash_state === 10) {
//                     return callback('提现记录状态错误, 请先更改状态为打款中才可继续', null);
//                 }
//                 if(his.cash_state === 20) {
//                     return callback('该笔提现记录已完成, 请勿重复操作', null);
//                 }
//                 if(his.cash_platform !== 20 && his.cash_platform !== 201 && his.cash_platform !== 202) {
//                     return callback('暂不支持的提现账户类型', null);
//                 }
//                 if(!his.cash_account || his.cash_account <=3) {
//                     return callback('提现账户有误, 请核实后重试', null);
//                 }
//                 if(his.cash_platform === 201 && (his.cash_amt - his.taxes) < 100) {
//                     return callback('微信提现最小金额为1元', null);
//                 }
//                 if(his.cash_platform === 20 &&  (his.cash_amt - his.taxes) < 10) {
//                     return callback('支付宝提现最小金额为0.1元', null);
//                 }
//                 const data = {};
//                 data.hisEntity = his;
//                 return callback(error, data);
//             });
//         });
//         // 按需创建订单号
//         totalTasks.push(function (data, callback) {
//             if(data.hisEntity.trade_no && data.hisEntity.trade_no.length >0) {
//                 return callback(null, data);
//             }
//
//             const tradeNo = codeUtil.genTradeNo({
//                 p00: 8,
//                 p01: 6
//             });
//             const entity = new YjxActFinanceHis({
//                 his_id: data.hisEntity.his_id,
//                 trade_no: tradeNo,
//             });
//             entity.updateToDB(function (error) {
//                 data.hisEntity.trade_no = tradeNo;
//                 return callback(error, data);
//             });
//         });
//
//         // 支付宝转账
//         totalTasks.push(function (data, callback) {
//             if(data.hisEntity.cash_platform !== 20) {
//                 return callback(null, data);
//             }
//
//             const name = DEVICE_SUBJECT_MAP[data.hisEntity.device] || DEVICE_SUBJECT_MAP['*'];
//             let defaultRemark = `${name}收益提现${data.hisEntity.cash_amt/100}元`;
//             // 702 (202 微信小程序) 不需要缴纳个税
//             if(Number(data.hisEntity.device) !== 702) {
//                 defaultRemark += ` (代缴个税${data.hisEntity.taxes/100}元)`;
//             }
//             if(data.hisEntity.desc) defaultRemark += data.hisEntity.desc;
//
//             const opt = {
//                 client: alipayClientsPool["*"],
//                 tradeId: data.hisEntity.his_id,
//                 tradeNo: data.hisEntity.trade_no,
//                 amount: data.hisEntity.cash_amt - data.hisEntity.taxes,
//                 payeeAccount: data.hisEntity.cash_account,
//                 remark: defaultRemark
//             };
//             // 测试环境处理
//             if(CONFIG.DEBUG) {
//                 opt.amount = 10; // 支付宝提现, 最小0.1元
//                 opt.remark = `测试提现 ${defaultRemark}`;
//             }
//             financialServiceUtil.alipayToAccountTransfer(opt, function (error, result) {
//                   data.retData = result;
//                   data.transferError = error;
//                   return callback(null, data);
//             });
//         });
//         // 微信转账
//         totalTasks.push(function (data, callback) {
//             // 非微信平台提现
//             if(data.hisEntity.cash_platform !== 10
//                 && (data.hisEntity.cash_platform <200 || data.hisEntity.cash_platform > 300)) {
//                 return callback(null, data);
//             }
//             const client = tenpayClientsPool[data.hisEntity.cash_platform];
//             if(!client) {
//                 return callback('暂不支持的转账平台', data);
//             }
//             const name = DEVICE_SUBJECT_MAP[data.hisEntity.device] || DEVICE_SUBJECT_MAP['*'];
//             let defaultDesc = `${name}收益提现${data.hisEntity.cash_amt/100}元`;
//             // 702 (202 微信小程序) 不需要缴纳个税
//             if(Number(data.hisEntity.device) !== 702) {
//                 defaultDesc += ` (代缴个税${data.hisEntity.taxes/100}元)`;
//             }
//             if(data.hisEntity.desc) defaultDesc += data.hisEntity.desc;
//             const opt = {
//                 client: client,
//                 partner_trade_no: data.hisEntity.trade_no,
//                 tradeId: data.hisEntity.his_id,
//                 platform: data.hisEntity.cash_platform,
//                 openId: data.hisEntity.cash_account,
//                 amount: data.hisEntity.cash_amt - data.hisEntity.taxes,
//                 desc: defaultDesc
//             };
//             if(CONFIG.DEBUG) {
//                 opt.amount = 100; // 微信打账最低1元
//                 opt.desc = `测试提现 ${defaultDesc}`;
//             }
//             financialServiceUtil.wxpayToAccountTransfer(opt, function (error, result) {
//                 data.retData = result;
//                 data.transferError = error;
//                 return callback(null, data);
//             });
//         });
//
//         // 修改订单状态
//         totalTasks.push(function (data, callback) {
//             const cashState = data.transferError ? 40 : 20;
//             const entity = new YjxActFinanceHis({
//                 his_id: data.hisEntity.his_id,
//                 cash_state: cashState,
//             });
//             if(data.retData && cashState === 20) {
//                 entity.remit_time = data.retData.payment_time || data.retData.alipay_fund_trans_toaccount_transfer_response.pay_date;
//             }
//             entity.updateToDB(function (error) {
//                 return callback(error || data.transferError, data);
//             });
//         });
//
//
//
//
//
//         async.waterfall(totalTasks, function (error, data) {
//             if(error) return callback(error, null);
//             return callback(error, data.retData);
//         });
//
//     };
//
//
//     return financialServiceUtil;
// })();
//
// module.exports = financialServiceUtil;